% emacs: -*- mode: latex; coding: utf-8; -*- 

% Copyright (c) 2007, ChenZaichun
% LISENCE: cretive common version 3
%

\documentclass[a4paper,11pt]{article}
\usepackage{CJKutf8}
\author{陈载春}
\usepackage[utf8]{inputenc}   % replace by the encoding you are using
\usepackage[T1]{fontenc}
%\usepackage[pdftex,unicode]{hyperref}
\title{FAT文件系统}
%\AtBeginDocument{\begin{CJK}{UTF8}{simhei}}
%\AtEndDocument{\closesection{}\end{CJK}}

\parskip=1.618ex
%\parindent=0pt
\usepackage[pdftex]{graphicx}
\usepackage[colorlinks,
		linkcolor=blue,
		hyperindex,
                pdfstartview=FitH,
                plainpages=false,
                bookmarksnumbered=true,
                unicode,
                pdftex]
                {hyperref}
%\usepackage[sf]{titlesec}
%\usepackage{titletoc}
\usepackage{makeidx,shortvrb,latexsym}

\usepackage{tex2page} 
%\htmlimageformat{png} 

\usepackage{CJKnumb, indentfirst}

\begin{document}
\texonly 
\pdfoutput=1
\begin{CJK}{UTF8}{simhei}
\pdfmapfile{=simhei.map}
\endtexonly 

\CJKtilde
\CJKindent

\maketitle
\begin{center}
\verb|$Id: fat.tex 37 2008-01-08 12:21:16Z ChenZaichun $|
\end{center}
\tableofcontents

\section{文件系统的基本原理}

文件分配表FAT（File Allocation Table）是文件管理系统用来给每个文件分配磁盘物理空间的表格，他告诉操作系统，文件存放在磁盘的什么地方。标准的FAT使用15位寻址方式；而FAT32簇使用32位寻址方式。文件系统的全部目的是跟踪文件，具体描述需要说明整个分区中每个存储单元（簇）的使用情况、文件数据的簇存储情况（连续或碎片）以及树型目录结构的描述。

\section{基本结构}

FAT文件系统由四个基本部分组成，依次为:
\begin{itemize}
\item{Reserved Region}
\item{FAT Region}
\item{Root Directory Region}
\item{File and Directory Data Region}
\end{itemize}

\section{引导扇区}

位于每个卷首的引导扇区是计算机启动的关键磁盘结构。引导扇区包含执行代码和代码所需的数据信息，包括文件系统信息。引导扇区的结束两字节为引导标记0x55AA。

引导扇区由以下部分组成：
\begin{itemize}
\item{一个基于x86的CPU跳转指令}
\item{引导扇区各自包含不同的BIOS参数表}
\end{itemize}
主引导记录执行引导扇区的CPU指令，因此一道扇区的头3个字节必须是可执行的基于X86的CPU指令，这是一个跳转指令，跳过下面不可执行的BIOS参数区域（BPB）。跳转指令后是8字节的OEM ID， 标志卷格式化操作系统的名称和版本。OEM ID后是BIOS参数去（BPB）。BPB的起始位置固定。当BPB格式变化加入新的内容而长度变化时，X86跳转指令也要相应的变化。

\section{引导扇区参数表}

磁盘BIOS参数表（BPB）描述磁盘的逻辑结构，是DOS文件系统在磁盘上存取文件的依据，文件存取中的簇与逻辑扇区之间的相互映射以及逻辑扇区与物理扇区之间的相互映射都需要借助该表。

用WinHex观察的过程：首先用WinHex打开FAT32格式的分区（Flash Disk）进行观察(见Figure~\ref{winhex})

\begin{figure}%[!hbp]
\includegraphics[width=\textwidth]{fat.jpg}
\caption{WinHex打开FAT32格式分区 图示} \label{winhex}
\end{figure}

磁盘的Boot Sector从0x0到0x03的数据为0xEB，0x52和0x90。这个是引导的跳转指令，该跳转指令指出操作系统引导。MS的文档中说明，该跳转指令还可以为另外一种形式：0xE9, 0x??和0x??。 而以0xEB开头的比较常见。

偏移地址0x00000000B到0x00000000C指出了每一扇区的byte值。从图中可以看出该磁盘的扇区Byte数为512（0x0200）。

偏移地址0x00000000D指出了每一个簇的扇区数。图中表明为8。

从上面的数据可以算出每一个簇所包含的byte数为512*8=4096。

\section{分区表}

分区表决定磁盘操作系统的基本设置，包括分区类型和位置。每个分区表长16字节，从主引导记录的0x01BE（446）开始。不满4个分区是剩下的填0。一个硬盘最多有4个分区，常见的多个逻辑卷在逻辑上是一个分区（扩展分区），严格意义上讲逻辑卷不是分区。此即卷和分区的区别。卷为引导扇区+数据区的一个逻辑概念，一个分区可能包含一个或多个卷。

\section{文件和目录}

FAT的文件和目录结构可以想象为指针。每一个磁盘分区都含有一张文件目录表，记录着整个磁盘上所有文件的有用信息。在文件目录表中，每个文件占32个字节：0-7字节表示文件名，共8个字节，不足8个的用29填满，如果第一个字节为00时，表示此项未用，为E5时表示此项已经删除。8-10字节表示扩展名，占3字节，无扩展名或不足3个的用20填充。11字节表示文件属性。具体含义是：20为归档文件，01为只读，不能对其进行修改和删除。02为隐含，不能用dir命令查找。04为系统文件，也不能用dir查找。10表示此项为子目录。28表示此项为磁盘的卷标（即磁盘的名字）。12-21共10个字节为保留字段，没有使用。22-23为建立文件的时间。24-25为建立文件日期。26-27位文件占用的第一个簇号，即起始簇。28-31共4个字节为此文件的长度。

\section{小结}

由于FAT文件的文件名为8个字节长，所以FAT不支持长文件名。

在使用WinHex的过程中，发现了很多原来删除文件的信息（不过现在还不知道某些软件如何将此文件恢复的原理）。

\newpage

\texonly 
\end{CJK}
\endtexonly 

\end{document}

